inspector: Be more careful with dead objects
authorMatthias Clasen <mclasen@redhat.com>
Sun, 25 Oct 2015 17:11:17 +0000 (13:11 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 25 Oct 2015 17:11:17 +0000 (13:11 -0400)
gtk_inspector_object_tree_find_object accesses the type information
of the object, so we can't safely use it on an already decaying
object when we get a weak notify. Instead just walk the tree and
compare pointers, that is safe.

https://bugzilla.gnome.org/show_bug.cgi?id=756852

gtk/inspector/object-tree.c

index e3fa9251855a425330df7b3e4481b262f60ab949..c124c79b549b62a1964ecf40406cbc64d710cf7d 100644 (file)
@@ -607,14 +607,32 @@ on_selection_changed (GtkTreeSelection       *selection,
   g_signal_emit (wt, signals[OBJECT_SELECTED], 0, object);
 }
 
+static gboolean
+remove_cb (GtkTreeModel *model,
+           GtkTreePath  *path,
+           GtkTreeIter  *iter,
+           gpointer      data)
+{
+  GObject *dead_object = data;
+  GObject *lookup;
+
+  gtk_tree_model_get (model, iter, OBJECT, &lookup, -1);
+
+  if (lookup == dead_object)
+    {
+      gtk_tree_store_remove (GTK_TREE_STORE (model), iter);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 static void
 gtk_object_tree_remove_dead_object (gpointer data, GObject *dead_object)
 {
   GtkInspectorObjectTree *wt = data;
-  GtkTreeIter iter;
 
-  if (gtk_inspector_object_tree_find_object (wt, dead_object, &iter))
-    gtk_tree_store_remove (wt->priv->model, &iter);
+  gtk_tree_model_foreach (GTK_TREE_MODEL (wt->priv->model), remove_cb, dead_object);
 }
 
 static gboolean